/**
在 TypeScript 中，构造签名（Construct Signature）用于定义一个类的构造函数的类型。构造签名描述了一个类实例化时所需的参数和返回值，这对于类型检查和接口的实现非常重要。
  1. 构造签名的基本语法

  构造签名的基本格式如下：
  type 类名 = new (参数名: 参数类型, ...) => 返回值类型;
  2. 示例

   2.1 基本构造签名

  定义一个构造签名，表示一个类可以接受两个数字参数并返回一个实例：
  type PointConstructor = new (x: number, y: number) => Point;

  class Point {
      constructor(public x: number, public y: number) {}
  }

  const point: PointConstructor = Point;
  const p = new point(1, 2); // 创建 Point 实例
   2.2 接口中的构造签名

  可以在接口中定义构造签名，以便描述具有特定构造函数的类：
  interface PointConstructor {
      new (x: number, y: number): Point;
  }

  class Point {
      constructor(public x: number, public y: number) {}
  }

  function createPoint(ctor: PointConstructor, x: number, y: number): Point {
      return new ctor(x, y);
  }

  const p = createPoint(Point, 3, 4); // 创建 Point 实例
  3. 结合其他类型

  构造签名可以与其他类型结合使用，例如泛型：
  interface GenericConstructor<T> {
      new (...args: any[]): T;
  }

  class Person {
      constructor(public name: string) {}
  }

  function createInstance<T>(ctor: GenericConstructor<T>, ...args: any[]): T {
      return new ctor(...args);
  }

  const person = createInstance(Person, "Alice"); // 创建 Person 实例
  4. 结论

  构造签名在 TypeScript 中是一个重要的特性，它允许开发者定义类的构造函数类型，从而提供更强的类型检查和代码可读性。通过使用构造签名，可以确保只有符合特定构造函数的类才能被实例化，从而提高代码的安全性和可维护性。在实际开发中，合理使用构造签名可以帮助开发者更好地管理类和实例化过程。
 */
class Person {}

interface ICTORPerson {
  new (): Person;
}

function factory(fn: ICTORPerson) {
  const f = new fn();
  return f;
}

const p = factory(Person); // Person